package persistencia.daos;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import logica.Mascota;
import logica.excepciones.ExcepPersistencia;
import logica.valueObjects.VODuenio;
import logica.valueObjects.VOMascota;
import persistencia.poolConexiones.IConexion;

public class DAOArchivoMascotas implements IDAOMascotas{

	private int cedulaDuenio;

	public DAOArchivoMascotas(int ced)
	{
		cedulaDuenio = ced;	
	}

	@Override
	public void borrarMascotas(IConexion icon) throws ExcepPersistencia {

		File f = new File(".");
		File[] archivos = f.listFiles(new FilenameFilter() {
			public boolean accept(File dir, String name) {
				return name.startsWith("mascotas") && name.endsWith("txt") && name.contains(String.valueOf(cedulaDuenio));
			}
		});

		for(int i=0 ; i<archivos.length ; i++){
			archivos[i].delete();
		}

	}

	@Override
	public void insert(IConexion icon, Mascota mascota)
	throws ExcepPersistencia {

		String apodo = mascota.getApodo();
		String raza = mascota.getRaza();
		FileOutputStream out = null;
		ObjectOutputStream o = null;

		VOMascota vomascota = new VOMascota(apodo, raza, cedulaDuenio);
		try {

			File f = new File(".");
			File[] archivos = f.listFiles(new FilenameFilter() {
				public boolean accept(File dir, String name) {
					return name.startsWith("mascotas") && name.endsWith("txt") && name.contains(String.valueOf(cedulaDuenio));
				}
			});

			if(archivos!=null && archivos.length != 0){
				List<VOMascota> list_VOM = new LinkedList<VOMascota>();

				FileInputStream finput = new FileInputStream(archivos[0]);
				ObjectInputStream oi = new ObjectInputStream(finput);
				list_VOM = (List<VOMascota>)oi.readObject();
				oi.close();
				finput.close();
				list_VOM.add(vomascota);

				out = new FileOutputStream(archivos[0]);
				o = new ObjectOutputStream(out);
				o.writeObject(list_VOM);
			}

			else{
				List<VOMascota> list_VOM = new LinkedList<VOMascota>();
				list_VOM.add(vomascota);
				out = new FileOutputStream("mascotas-" + cedulaDuenio + ".txt");
				o = new ObjectOutputStream(out);
				o.writeObject (list_VOM);

			}


		} catch (FileNotFoundException e) {
			e.printStackTrace();
			throw new ExcepPersistencia(e.getMessage());
		} catch (IOException e) {
			e.printStackTrace();
			throw new ExcepPersistencia(e.getMessage());
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			try {
				o.close();
			} catch (IOException e1) {
				e1.printStackTrace();
				throw new ExcepPersistencia(e1.getMessage());
			}
			try {
				out.close();
			} catch (IOException e) {
				e.printStackTrace();
				throw new ExcepPersistencia(e.getMessage());
			}
		}


	}

	@Override
	public List<VOMascota> listarMascotas(IConexion icon)
	throws ExcepPersistencia {
		List<VOMascota> listaVOMascotas = null;
		try{
			listaVOMascotas = new LinkedList<VOMascota>();
			File f = new File(".");
			File[] archivos = f.listFiles(new FilenameFilter() {
				public boolean accept(File dir, String name) {
					return name.startsWith("mascotas") && name.endsWith("txt") && name.contains(String.valueOf(cedulaDuenio));
				}
			});
			for (int i = 0; i < archivos.length; i++) {
				FileInputStream finput = new FileInputStream(archivos[i]);
				ObjectInputStream o = new ObjectInputStream(finput);
				listaVOMascotas = (List<VOMascota>)o.readObject();
				o.close();
				finput.close();
			}
		}catch(IOException e){
			e.printStackTrace();
			throw new ExcepPersistencia(e.getMessage());
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			throw new ExcepPersistencia(e.getMessage());
		}

		return listaVOMascotas;
	}

	@Override
	public boolean member(IConexion icon, String apodo)
	throws ExcepPersistencia {
		boolean existe = false;
		List<VOMascota> listaMascotas = null ;
		int i = 0;
			try {
				
				File f = new File(".");
				File[] archivos = f.listFiles(new FilenameFilter() {
					public boolean accept(File dir, String name) {
						return name.startsWith("mascota") && name.endsWith("txt");
					}
				});
				while(i < archivos.length && existe==false){
					FileInputStream finput = new FileInputStream(archivos[i]);
					ObjectInputStream o = new ObjectInputStream(finput);
					listaMascotas = (List<VOMascota>)o.readObject();
					o.close();
					finput.close();
					int j= 0;
					while(j < listaMascotas.size() && existe==false){
						VOMascota mascota = listaMascotas.get(j);
						if(mascota.getApodo().equals(apodo)){
							existe = true;
						}
						j++;
					}					
					i++;
				}				


			} catch (FileNotFoundException e) {
				e.printStackTrace();
				throw new ExcepPersistencia(e.getMessage());
			} catch (IOException e) {
				e.printStackTrace();
				throw new ExcepPersistencia(e.getMessage());
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
				throw new ExcepPersistencia(e.getMessage());
			}
		return existe;

	}
}
